package services

import (
	"encoding/json"
	"os"
	"path/filepath"
	"sync"
)

// ConfigService 配置服务
type ConfigService struct {
	configPath string
	config     *AppConfig
	mu         sync.RWMutex
}

// AppConfig 应用配置
type AppConfig struct {
	SiliconFlowAPIKey string `json:"siliconFlowAPIKey"`
	OCRModelID        string `json:"ocrModelID"`
	TemplatesFolder   string `json:"templatesFolder"`
}

// NewConfigService 创建配置服务
func NewConfigService() *ConfigService {
	homeDir, _ := os.UserHomeDir()
	configDir := filepath.Join(homeDir, ".batch-doc-generator")
	os.MkdirAll(configDir, 0755)
	
	configPath := filepath.Join(configDir, "config.json")
	
	return &ConfigService{
		configPath: configPath,
	}
}

// LoadConfig 加载配置
func (s *ConfigService) LoadConfig() (*AppConfig, error) {
	s.mu.RLock()
	if s.config != nil {
		s.mu.RUnlock()
		return s.config, nil
	}
	s.mu.RUnlock()

	s.mu.Lock()
	defer s.mu.Unlock()

	// 双重检查
	if s.config != nil {
		return s.config, nil
	}

	// 读取配置文件
	if _, err := os.Stat(s.configPath); os.IsNotExist(err) {
		// 如果文件不存在，创建默认配置
		s.config = &AppConfig{
			SiliconFlowAPIKey: "",
			OCRModelID:        "",
			TemplatesFolder:   "",
		}
		return s.config, nil
	}

	data, err := os.ReadFile(s.configPath)
	if err != nil {
		return nil, err
	}

	var config AppConfig
	err = json.Unmarshal(data, &config)
	if err != nil {
		return nil, err
	}

	s.config = &config
	return s.config, nil
}

// SaveConfig 保存配置
func (s *ConfigService) SaveConfig(config *AppConfig) error {
	s.mu.Lock()
	defer s.mu.Unlock()

	data, err := json.MarshalIndent(config, "", "  ")
	if err != nil {
		return err
	}

	err = os.WriteFile(s.configPath, data, 0644)
	if err != nil {
		return err
	}

	s.config = config
	return nil
}

// GetConfig 获取配置
func (s *ConfigService) GetConfig() (*AppConfig, error) {
	return s.LoadConfig()
}

// UpdateConfig 更新配置
func (s *ConfigService) UpdateConfig(updates *AppConfig) error {
	config, err := s.LoadConfig()
	if err != nil {
		return err
	}

	if updates.SiliconFlowAPIKey != "" {
		config.SiliconFlowAPIKey = updates.SiliconFlowAPIKey
	}
	if updates.OCRModelID != "" {
		config.OCRModelID = updates.OCRModelID
	}
	if updates.TemplatesFolder != "" {
		config.TemplatesFolder = updates.TemplatesFolder
	}

	return s.SaveConfig(config)
}

